package ar.org.sstuyv


import grails.converters.JSON

import java.text.DateFormat

import org.springframework.dao.DataIntegrityViolationException

class CensoController {

	//TODO: sacar los GET cuando arregle la redirecci�n
//	static allowedMethods = [save: "POST", save: "GET", update: "POST",update: "GET", delete: "POST"]
	
	def comunService 
	
	def  configuradorGrillaCensoService
//	ConfiguradorGrilla configuradorGrillaCensoService = new ConfiguradorGrillaCensoService()
	
	def index() {
		redirect(action: "list", params: params)
	}

	def list(Integer max) {
		params.max = Math.min(max ?: 10, 100)
		[solicitudSocialInstanceList: SolicitudSocial.list(params), solicitudSocialInstanceTotal: SolicitudSocial.count()]
	}


	def create() {
		[censoInstance: new Censo(params)]
	}

//	def save() {

//		Partido partido  = Partido.get(params.get("ncpartido"))
//
//		Barrio barrio = new Barrio()
//		barrio.setNombre(params.get("sbarrio"))
//		barrio.save()
//
//		Referente referenteBarrial = new Referente()
//		referenteBarrial.setNombre(params.get("nombreReferenteBarrial"))
//		referenteBarrial.setDireccion(params.get("direccionReferenteBarrial"))
//		referenteBarrial.setTelefono(params.get("telefonoReferenteBarrial"))
//		referenteBarrial.save()
//
//		Referente referenteMunicipal = new Referente()
//		referenteMunicipal.setNombre(params.get("nombreReferenteMunicipal"))
//		referenteMunicipal.setDireccion(params.get("direccionReferenteMunicipal"))
//		referenteMunicipal.setTelefono(params.get("telefonoReferenteMunicipal"))
//		referenteMunicipal.save()
//
//		NomenclaturaCatastral nomenclaturaCatastral = new NomenclaturaCatastral()
//		nomenclaturaCatastral.setCircunscripcion(params.get("nccircunscripción"))
//		nomenclaturaCatastral.setSeccion(params.get("ncseccion"))
//		nomenclaturaCatastral.setNumeroChacra(params.get("ncnumeroChacra"))
//		nomenclaturaCatastral.setLetraChacra(params.get("ncletraChacra"))
//		nomenclaturaCatastral.setNumeroQuinta(params.get("ncnumeroQuinta"))
//		nomenclaturaCatastral.setLetraQuinta(params.get("ncletraQuinta"))
//		nomenclaturaCatastral.setNumeroFraccion(params.get("ncnumeroFraccion"))
//		nomenclaturaCatastral.setLetraFraccion(params.get("ncletraFraccion"))
//		nomenclaturaCatastral.setLetraManzana(params.get("ncletramanzana"))
//		nomenclaturaCatastral.setNumeroManzana(params.get("ncnumeroManzana"))
//		nomenclaturaCatastral.setNumeroParcela(params.get("ncnumeroParcela"))
//		nomenclaturaCatastral.setLetraParcela(params.get("ncletraParcela"))
//		nomenclaturaCatastral.setSpartido(partido?.getCodigo()?.toString())
//		nomenclaturaCatastral.save()
//
//		def censoInstance = new Censo(params)
//
//		censoInstance.setBarrio(barrio)
//		censoInstance.setPartido(Partido.get(params.get("ncpartido")))
//		censoInstance.setReferenteBarrial(referenteBarrial)
//		censoInstance.setReferenteMunicipal(referenteMunicipal)
//		censoInstance.setNomenclaturaCatastral(nomenclaturaCatastral)
//
//		if (!censoInstance.save(flush: true)) {
//			censoInstance.setNomenclaturaCatastral(nomenclaturaCatastral)
//			render(view: "create", model: [censoInstance: censoInstance])
//			return8
//		}
//
//
//		flash.message = message(code: 'default.created.message', args: [
//			message(code: 'censo.label', default: 'Censo'),
//			censoInstance.id
//		])
//		redirect(action: "show", id: censoInstance.id)
//	}

	def show(Long id) {
		def censoInstance = Censo.get(id)
		if (!censoInstance) {
			flash.message = message(code: 'default.not.found.message', args: [
				message(code: 'censo.label', default: 'Censo'),
				id
			])
			redirect(action: "list")
			return
		}

		[censoInstance: censoInstance]
	}

	def edit(Long id) {
		def censoInstance = Censo.get(id)
		if (!censoInstance) {
			flash.message = message(code: 'default.not.found.message', args: [
				message(code: 'censo.label', default: 'Censo'),
				id
			])
			redirect(action: "list")
			return
		}

		[censoInstance: censoInstance]
	}

	//TODO: ojo con este update: Ver si lo uso en dialog censo
//	def update(Long id, Long version) {
//		def censoInstance = Censo.get(id)
//		if (!censoInstance) {
//			flash.message = message(code: 'default.not.found.message', args: [
//				message(code: 'censo.label', default: 'Censo'),
//				id
//			])
//			redirect(action: "list")
//			return
//		}
//
//		if (version != null) {
//			if (censoInstance.version > version) {
//				censoInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
//						[
//							message(code: 'censo.label', default: 'Censo')] as Object[],
//						"Another user has updated this Censo while you were editing")
//				render(view: "edit", model: [censoInstance: censoInstance])
//				return
//			}
//		}
//
//		censoInstance.properties = params
//
//		if (!censoInstance.save(flush: true)) {
//			render(view: "edit", model: [censoInstance: censoInstance])
//			return
//		}
//
//		flash.message = message(code: 'default.updated.message', args: [
//			message(code: 'censo.label', default: 'Censo'),
//			censoInstance.id
//		])
//		redirect(action: "show", id: censoInstance.id)
//	}

	def update =  {
		def censoInstance = Censo.get(params.id.toLong())
		if (censoInstance) {
			if (params.version) {
				def version = params.version.toLong()
				if (censoInstance.version > version) {
					render "error"
				}
			}
					
			Date fecha			
			DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
			Date date =  df.parse(params.fecha)
			censoInstance.setFecha(date)
			
			censoInstance.setManzanas(params.manzanas)
			
			Partido partido = Partido.findById(params.partido)
			censoInstance.setPartido(partido)
			
			Barrio barrio = Barrio.findById(params.barrio)
			censoInstance.setBarrio(barrio)
			
			TipoEncuadreLegal tec = TipoEncuadreLegal.findById(params.tipoEncuadreLegal)
			censoInstance.setTipoEncuadreLegal(tec)
			
			EncuadreLegal expropiacion = EncuadreLegal.findByNumLey1(params.expropiaciones)
			censoInstance.setExpropiacion(expropiacion)
			
			NomenclaturaCatastral nomenclatura = NomenclaturaCatastral.findById(params.nomenclaturaCatastralId)
			censoInstance.setNomenclaturaCatastral(nomenclatura)
			
			NomenclaturaCatastral nomenclaturaDefinitiva = NomenclaturaCatastral.findById(params.nomenclaturaDefinitivaId)
			censoInstance.setNomenclaturaDefinitiva(nomenclaturaDefinitiva)
			
			User user = User.findByUsername(params.profesionalACargo)
			censoInstance.setProfesionalACargo(user)
			
			if (!params.numero.isEmpty()){	
				censoInstance.setNumero(params.numero.toInteger())
			}
			
			Referente referenteBarrial = Referente.findByNombre(params.referenteBarrial)
			censoInstance.setReferenteBarrial(referenteBarrial)
			
			Referente referenteMunicipal = Referente.findByNombre(params.referenteMunicipal)
			censoInstance.setReferenteMunicipal(referenteMunicipal)
		
//			def expediente = Expediente.createCriteria().list() {
//				if (params.numero) like('numero', "%${params.expediente}%")
//			}
//			censoInstance.setExpediente(expediente.get(0) )
			Expediente expediente = Expediente.findByNumero(params.expediente)
			censoInstance.setExpediente(expediente)

			if (censoInstance.save(flush: true)) {
				render "success" //�?
				
			}
			else {
				render "error"
			}
		}
		else {
			render "error"
		}
	}
	
	
//	def delete(Long id) {
//		def censoInstance = Censo.get(id)
//		if (!censoInstance) {
//			flash.message = message(code: 'default.not.found.message', args: [
//				message(code: 'censo.label', default: 'Censo'),
//				id
//			])
//			redirect(action: "list")
//			return
//		}
//
//		try {
//			censoInstance.delete(flush: true)
//			flash.message = message(code: 'default.deleted.message', args: [
//				message(code: 'censo.label', default: 'Censo'),
//				id
//			])
//			redirect(action: "list")
//		}
//		catch (DataIntegrityViolationException e) {
//			flash.message = message(code: 'default.not.deleted.message', args: [
//				message(code: 'censo.label', default: 'Censo'),
//				id
//			])
//			redirect(action: "show", id: id)
//		}
//	}

//	def beneficioFlow = {
//
//		ingresarCabecera {
//			on("siguiente"){ 
//				Partido part = comunService.obtenerPartido(params)
//				Barrio ba = comunService.crearBarrio(params)
//				NomenclaturaCatastral nc = comunService.crearNomenclaturaCatastral(params)
//				Referente rb = comunService.crearReferenteBarrial(params)
//				Referente rm = comunService.crearReferenteMunicipal(params)
//				Censo cen = comunService.crearCenso(params)
//				
////				ValidacionSensoCommand vsc -> 
//				ValidacionSensoCommand vsc 
////				if(vsc.hasErrors() || vsc.tienePartido()){
////					flow.datosCenso = vsc
////					return error()
//				//}
//				flow.censo = cen
//				flow.partido = part
//				flow.barrio = ba
//				flow.nomenclaturaCatastral = nc
//				flow.referenteBarrial = rb
//				flow.referenteMuncipal = rm
//				
//				//[censo : cen, partido : part, barrio : ba, nomenclaturaCatastral : nc, referenteBarrial : rb, referenteMunicipal : rm]
//				
//			}.to("ingresarBeneficio")
//			on("cancelar").to("fin")
//		}
//		
//		ingresarBeneficio {
//			on("siguiente"){
//				
//				String nm = params.get("ncnumeroManzana")
//				String lm = params.get("ncletraManzana")
//				String np = params.get("ncnumeroParcela")
//				String lp = params.get("ncletraParcela")
//				flow.nomenclaturaCatastral.setNumeroManzana(nm)
//				flow.nomenclaturaCatastral.setLetraManzana(lm)
//				flow.nomenclaturaCatastral.setNumeroParcela(np)
//				flow.nomenclaturaCatastral.setLetraParcela(lp)
//				
//				// Al seleccionar ir a beneficio
//				/*
//				Persona persona = new Persona()
//				persona.setApellido(params.get("apellido"))
//				persona.setNombres(params.get("nombres"))
//				persona.setNumeroDocumento(params.get("numeroDocumento"))
//				Beneficio beneficio
//				if(flow.beneficio == null){
//					beneficio = new Beneficio()
//					flow.beneficio = beneficio
//				}
//				
//				flow.beneficio.getBeneficiarios().add(persona)*/
//
//			}.to("ingresarPersonas")
//			on("guardar"){
//				flow.censo.save()
//			}.to("fin")
//			on("cancelar").to("fin")
//		}
//		
//		ingresarPersonas {
//			on("ingresarPersonas"){
//				// Al seleccionar Nuevo beneficiario
//				Persona persona = new Persona()
//				persona.setApellido(params.get("apellido"))
//				persona.setNombres(params.get("nombres"))
//				persona.setNumeroDocumento(params.get("numeroDocumento"))
//				Beneficio beneficio
//				if(flow.beneficio == null){
//					beneficio = new Beneficio()
//					flow.beneficio = beneficio
//				}
//				
//				flow.beneficio.getBeneficiarios().add(persona)
//				
//				
//			}.to("ingresarPersonas")
//			on("irABeneficio"){
//				// Al seleccionar Nuevo beneficiario
//				Persona persona = new Persona()
//				persona.setApellido(params.get("apellido"))
//				persona.setNombres(params.get("nombres"))
//				persona.setNumeroDocumento(params.get("numeroDocumento"))
//				Beneficio beneficio
//				if(flow.beneficio == null){
//					beneficio = new Beneficio()
//					flow.beneficio = beneficio
//				}
//				
//				flow.beneficio.getBeneficiarios().add(persona)
//				
//			}.to("ingresarBeneficio")
//			on("cancelar").to("ingresarBeneficio")
//			on("guardar"){
//				flow.censo.save()
//			}.to("fin")
//			
//			
//		fin {
//			redirect(controller:"censo", action:"list")
//		}
//		}
//		}
	
//	def listAdvancedJSON = {
//		
//		def sortIndex = params.sidx ?: 'id'
//		def sortOrder  = params.sord ?: 'asc'
//		def maxRows = Integer.valueOf(params.rows)
//		def currentPage = Integer.valueOf(params.page) ?: 1
//		def rowOffset = currentPage == 1 ? 0 : (currentPage - 1) * maxRows
//		
//		//TODO: �Y ESTO?
//		def el = Censo.createCriteria().list(max: maxRows, offset: rowOffset) {
//			
//			if (params.id) ilike('id', params.numeLey1)
//			
//			order(sortIndex, sortOrder)
//		}
//		
//		def totalRows = el.totalCount
//		def numberOfPages = Math.ceil(totalRows / maxRows)
//		
//		def results = el?.collect {
//			
//			[
//				cell: [it.id, it.facha, it.partido?.nombre, it.barrio?.nombre],
//				 id: it.id
//			]
//		}
//
//		
//		def jsonData = [rows: results, page: currentPage, records: totalRows, total: numberOfPages]
//		
//		render jsonData as JSON
//	}
	
	
		def save = {
			def censoInstance = new Censo()
			
			Date fecha			
			DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
			Date date =  df.parse(params.fecha)
			censoInstance.setFecha(date)
				
			censoInstance.setManzanas(params.manzanas)
			
			Partido partido = Partido.findById(params.partido)
			censoInstance.setPartido(partido)
			
			Barrio barrio = Barrio.findById(params.barrio)
			censoInstance.setBarrio(barrio)
			
			TipoEncuadreLegal tec = TipoEncuadreLegal.findById(params.tipoEncuadreLegal)
			censoInstance.setTipoEncuadreLegal(tec)
			
			EncuadreLegal expropiacion = EncuadreLegal.findByNumLey1(params.expropiaciones)
			censoInstance.setExpropiacion(expropiacion)
			
			NomenclaturaCatastral nomenclatura = NomenclaturaCatastral.findById(params.nomenclaturaCatastralId)
			censoInstance.setNomenclaturaCatastral(nomenclatura)
			
			NomenclaturaCatastral nomenclaturaDefinitiva = NomenclaturaCatastral.findById(params.nomenclaturaDefinitivaId)
			censoInstance.setNomenclaturaDefinitiva(nomenclaturaDefinitiva)
			
			User user = User.findByUsername(params.profesionalACargo)
			censoInstance.setProfesionalACargo(user)
			
			if (!params.numero.empty ){
				censoInstance.setNumero(params.numero.toInteger())
			}
			
			Referente referenteBarrial = Referente.findByNombre(params.referenteBarrial)
			censoInstance.setReferenteBarrial(referenteBarrial)
			
			Referente referenteMunicipal = Referente.findByNombre(params.referenteMunicipal)
			censoInstance.setReferenteMunicipal(referenteMunicipal)		
		
			Expediente expediente = Expediente.findByNumero(params.expediente)
			censoInstance.setExpediente(expediente)
				
			censoInstance.save(failOnError:true, flush:true)
			
			render ""
			
		}
	
	
	def buscar = {
		SolicitudSocial solicitud = SolicitudSocial.findById(params.id)
		def campoCenso = solicitud.censo
		def results
		if(campoCenso != null) {			
			Censo censo = Censo.findById(campoCenso.id)			
			results = censo?.collect {
				[
					cell: [it.id, it.fecha, it.manzanas, it.referenteBarrial?.nombre, it.referenteMunicipal?.nombre, params.id],
					id: it.id
				]
			}		
		} 
		def jsonData = [rows: results]
		render jsonData as JSON
	}
	

	
	def listJson = {
		
		def sortIndex = params.sidx ?: 'id'
		def sortOrder  = params.sord ?: 'desc'
		def maxRows = Integer.valueOf(params.rows)
		def currentPage = Integer.valueOf(params.page) ?: 1
		def rowOffset = currentPage == 1 ? 0 : (currentPage - 1) * maxRows
		
		def censo = Censo.createCriteria().list(max: maxRows, offset: rowOffset) {
//			if (params.id) eq('id', params.id.toLong())
			order(sortIndex, sortOrder)
		}
		
		def totalRows = censo.totalCount
		def numberOfPages = Math.ceil(totalRows / maxRows)
		
		def results = censo?.collect {
				[
					cell: [
						//it.id,
						it.expediente?.numero,
						it.numero,
						it.fecha,
						it.tipoEncuadreLegal?.nombre,
						it.expropiacion?.numLey1,
						it.profesionalACargo?.username,
						it.partido?.nombre,
						it.barrio?.nombre,
						it.nomenclaturaCatastral?.spartido +' '+ it.nomenclaturaCatastral?.circunscripcion +' '+ it.nomenclaturaCatastral?.seccion +' '+
						it.nomenclaturaCatastral?.numeroChacra + it.nomenclaturaCatastral?.letraChacra +' '+
						it.nomenclaturaCatastral?.numeroQuinta + it.nomenclaturaCatastral?.letraQuinta +' '+
						it.nomenclaturaCatastral?.numeroFraccion + it.nomenclaturaCatastral?.letraFraccion, 
						it.nomenclaturaCatastral?.id,
						it.nomenclaturaDefinitiva?.spartido +' '+ it.nomenclaturaDefinitiva?.circunscripcion +' '+ it.nomenclaturaDefinitiva?.seccion +' '+
						it.nomenclaturaDefinitiva?.numeroChacra + it.nomenclaturaDefinitiva?.letraChacra +' '+
						it.nomenclaturaDefinitiva?.numeroQuinta + it.nomenclaturaDefinitiva?.letraQuinta +' '+
						it.nomenclaturaDefinitiva?.numeroFraccion + it.nomenclaturaDefinitiva?.letraFraccion,
						it.nomenclaturaDefinitiva?.id,
//						it.manzanas, 
						it.referenteBarrial?.nombre, 
						it.referenteMunicipal?.nombre, 
//						params.id
						],
					id: it.id
				]
		}

		
		def jsonData = [rows: results, page: currentPage, records: totalRows, total: numberOfPages ]
		render jsonData as JSON
	
	}
	
	def getColumnas = {
		def data = configuradorGrillaCensoService.obtenerColumnas()
		print data as JSON
		render data as JSON

	}
	
	def profesionales = {
		
				def lst = User.findAll()
				StringBuffer buf = new StringBuffer("<select>")
				lst.each{
					buf.append("<option value=\"${it.username}\">")
					buf.append(it.username)
					buf.append("</option>")
					}
				buf.append("</select>")
				
				render buf.toString()
				
			}
	
	
	
	
}
